<?php
namespace app\common\controller;
use \Firebase\JWT\JWT;
class Jwts
{
   //生成验签
    public function signToken($uid){
        $key=__MYKEY__;
        $token=array(
            "iss"=>'',//签发者 可以为空
            "aud"=>'', //面象的用户，可以为空
            "iat"=>time(), //签发时间
            "nbf"=>time(),  //在什么时候jwt开始生效  （这里表示生成0秒后才生效）
            "exp"=> time()+3600, //token 过期时间 3600秒
            "uid"=>$uid
        );
        $jwt = JWT::encode($token, $key,"HS256");
        return $jwt;
    }

    //验证token
    public function checkToken($token){
        $key=__MYKEY__;
        try {
            JWT::$leeway = 60;//当前时间减去60，把时间留点余地
            $decoded = JWT::decode($token, $key, ['HS256']); //HS256方式，这里要和签发的时候对应
            $arr = (array)$decoded;
            $returndata['code'] = "200";//200=成功
            $returndata['msg'] = "success";//
            $returndata['data'] = $arr;//返回的数据
            return json_encode($returndata); //返回信息
        } catch (\Firebase\JWT\SignatureInvalidException $e) {  //签名不正确
            $returndata['code'] = "101";//101=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return json_encode($returndata); //返回信息
        } catch (\Firebase\JWT\BeforeValidException $e) {  // 签名在某个时间点之后才能用
            $returndata['code'] = "102";//102=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return json_encode($returndata); //返回信息
        } catch (\Firebase\JWT\ExpiredException $e) {  // token过期
            $returndata['code'] = "103";//103=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return json_encode($returndata); //返回信息
        } catch (Exception $e) {  //其他错误
            $returndata['code'] = "199";//199=签名不正确
            $returndata['msg'] = $e->getMessage();
            $returndata['data'] = "";//返回的数据
            return json_encode($returndata); //返回信息
        }
        //Firebase定义了多个 throw new，我们可以捕获多个catch来定义问题，
    }
}
